package pl.edu.pk.psb.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import pl.edu.pk.psb.bc.bo.UzytkownikBo;
import pl.edu.pk.psb.bc.bo.WydarzenieBo;
import pl.edu.pk.psb.bc.dto.UzytkownikDto;
import pl.edu.pk.psb.bc.dto.WydarzenieDto;
import pl.edu.pk.psb.command.RezerwacjaBiletuCommand;
import pl.edu.pk.psb.validator.RezerwacjaBiletuValidator;

@Controller
public class RezerwacjaBiletuController {

	@Autowired
	WydarzenieBo wydarzenieBo;
	
	@Autowired
	UzytkownikBo uzytkownikBo;
	
	@Autowired
	RezerwacjaBiletuValidator rezerwacjaBiletuValidator;

	@ModelAttribute("command")
	public RezerwacjaBiletuCommand stworzRezerwacjaBiletuCommand() {
		return new RezerwacjaBiletuCommand();
	}

	@RequestMapping(value="/rezerwacjaBiletu", method = RequestMethod.GET)
	public ModelAndView przekierujDoRezerwacjiBiletu(@RequestParam Integer id, @ModelAttribute("command") RezerwacjaBiletuCommand command) {
		WydarzenieDto wydarzenie = wydarzenieBo.pobierzWydarzenie(id);
		Map<String, Object> model = new HashMap<String, Object>();
		model.put("wydarzenie", wydarzenie);
		if(wydarzenie.getSala() != null){
			model.put("miejsca", wydarzenie.getSala().getMiejsca());
		}
		command.setIdWydarzenia(wydarzenie.getId());
		return new ModelAndView("rezerwacjaBiletu", model);
	}

	@RequestMapping(value="/rezerwacjaBiletu", method = RequestMethod.POST)
	public ModelAndView zarezerwujBilet(@ModelAttribute("command") RezerwacjaBiletuCommand command, BindingResult bledy, HttpSession session) {
		if(StringUtils.isNotBlank(command.getWybraneMiejsca())){
			String[] listaIdMiejscString =  command.getWybraneMiejsca().split(":");
			List<Integer> listaIdMiejsc = new ArrayList<Integer>();
			for(int i=0 ;  i<listaIdMiejscString.length ; i++){
				listaIdMiejsc.add(Integer.parseInt(listaIdMiejscString[i]));			
			}
			uzytkownikBo.rezerwujMiejsca((UzytkownikDto)session.getAttribute("uzytkownik"), listaIdMiejsc, command.getIdWydarzenia());
		}else if(StringUtils.isNotBlank(command.getIleMiejsc())){
			rezerwacjaBiletuValidator.validate(command, bledy);
			if(bledy.hasErrors()){
				WydarzenieDto wydarzenie = wydarzenieBo.pobierzWydarzenie(command.getIdWydarzenia());
				Map<String, Object> model = new HashMap<String, Object>();
				model.put("wydarzenie", wydarzenie);
				return new ModelAndView("rezerwacjaBiletu");
			}
			uzytkownikBo.rezerwujMiejsca((UzytkownikDto)session.getAttribute("uzytkownik"), command.getIdWydarzenia(), Integer.parseInt(command.getIleMiejsc()));
		}
		session.setAttribute("wiadomosc", "rezerwacjaBiletu.potwierdzenie");
		return new ModelAndView("redirect:/pokazWydarzenie?id="+command.getIdWydarzenia());
	}

}
